<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Classe Model dalla quale ereditano tutte le calssi di tipo model
 *
 * @author andrea
 */
class Foundation_cuspo {

  public $tableName;
  public $installationFields;

  public function __construct() {
    global $config_cuspo;
    $this->installationFields = array(
        array(
            0 => 'id',
            1 => 'int',
            2 => 'NOT NULL AUTO_INCREMENT PRIMARY KEY'
        ),
        array(
            0 => 'descrizione',
            1 => 'TEXT',
            2 => 'NOT NULL'
        ),
        array(
            0 => 'titolo',
            1 => 'TEXT',
            2 => ''
        ),
        array(
            0 => "thumbnail",
            1 => "TEXT",
            2 => ""
        ),
        array(
            0 => "wp_post_id",
            1 => "int",
            2 => "NOT NULL"
        ),
        array(
            0 => "in_evidenza",
            1 => "ENUM",
            2 => "('y','n')"
        )
    );
  }

  /**
   * Funzione che elabora le query per creare tabelle nel database
   * @param string $tableName Nome della tabella da creare
   * @param array $fields Array dove ogni riga è un array contenente 
   *          [0]->nome del campo 
   *          [1]->tipo del campo
   *          [2]->opzioni linguaggio MySQL
   * @return string query di creazione
   */
  public function createQuery($tableName, $fields) {
    global $debug;
    $create = "CREATE TABLE " . $tableName . "(";
    $length = count($fields);
    foreach ($fields as $key => $value) {
      $create .= "$value[0] " . $value[1] . " " . $value[2];
      if ($key < $length - 1)
        $create .= ", ";
      else
        $create .= ")";
    }
    return $create;
  }

  /**
   * Funzione che elabora query atte a eliminare tabelle nel database
   * @param string $tableName Nome della tabella da eliminare
   * @return string $query la query per l'eliminazione
   */
  public function dropTable($tableName) {
    $query = "DROP TABLE IF EXISTS " . $tableName;
    return $query;
  }

  public function countEntries($table, $fromLimit, $howMany) {
    global $wpdb;
    $query = "SELECT COUNT (*) FROM " . $table . " LIMIT " . $fromLimit;
    if ($howMany != false)
      $query .= "," . $howMany;
    return $wpdb->get_var($query);
  }

  public function avgQuery($table, $fieldAvg, $where = false) {
    $debug = USingleton_cuspo::getInstances("UDebug_cuspo");
    $query = "SELECT AVG(" . $fieldAvg . ") as average ";
    $query .= " FROM " . $table;

    if ($where != false) {
      $query .= " WHERE ";
      foreach ($where as $key => $value) {
        if (!preg_match("/[INin]/", $value[1]))
          $query .= $value[0] . $value[1] . "'" . $value[2] . "'";
        else
          $query .= $value[0] . $value[1] . $value[2];
        if ($key < $length - 1)
          $query .= " AND ";
      }
    }
    return $query;
  }

  /**
   *
   * @param type $from
   * @param type $where
   * @param type $select 
   */
  public function searchQuery($select = array("*"), $from = "", $where = false, $limit = false, $order = false, $join = false, $options = false) {
    $debug = USingleton_cuspo::getInstances("UDebug_cuspo");
    $query = "SELECT ";
    $length = count($select);
    foreach ($select as $key => $value) {
      $query .= "$value";
      if ($key < $length - 1)
        $query .= ", ";
      else
        $query .= " ";
    }
    $query .= "FROM ";
    if (!is_array($from))
      $query .= $from;
    else {
      $length = count($from);
      foreach ($from as $key => $value) {
        $query .= $value;
        if ($key < $length - 1)
          $query .= ", ";
      }
    }
    $length = count($where);
    $lengthj = count($join);
    if ($where != false) {
      $query .= " WHERE ";
      if ($join != false)
        foreach ($join as $key => $value) {
          $query .= $value[0] . "=" . $value[1];
          $query .= " AND ";
        }
      foreach ($where as $key => $value) {
        if (!preg_match("/[INin]/", $value[1]))
          $query .= $value[0] . $value[1] . "'" . $value[2] . "'";
        else
          $query .= $value[0] . $value[1] . $value[2];
        if ($key < $length - 1)
          $query .= " AND ";
      }
    }

    if ($options != false)
      $query .= " $options";
    if ($order != false)
      $query .= " order by " . $order;
    if ($limit != false)
      $query .= " limit " . $limit . " ";
    return $query;
  }

  /**
   * Crea una query del tipo "select * from table where a="x" or b="y"  
   */
  public function orQuery($select = array('*'), $from = "", $field = "", $list = false, $order = false) {
    $query = "SELECT ";
    $length = count($select);
    foreach ($select as $key => $value) {
      $query .= "$value";
      if ($key < $length - 1)
        $query .= ", ";
      else
        $query .= " ";
    }
    $query .= "FROM " . $from;
    if ($list != false) {
      $length = count($list);
      $query .= " WHERE ";
      foreach ($list as $key => $value) {
        $query .= $field . "=" . "'" . $value . "'";
        if ($key < $length - 1)
          $query .= " OR ";
      }
    }
    if ($order != false)
      $query .= " order by " . $order;
    return $query;
  }

  /**
   * La funzione esegue la query passata come parametro
   * @global mixed $wpdb Oggetto di Wordpress per la gestione del database
   * @param string $query Query da eseguire
   */
  public function executeQuery($query) {
    global $wpdb;
    $wpdb->query($query);
  }

  /**
   * Sposta il file nella cartella passata
   * @param string $uploadDir la cartella nella quale bisogna spostare il file
   * @param string $filename il nome del file da spostare e rinominare
   * @return bool il nome del file se non ci sono errori, false in caso di errori 
   */
  public function moveFile($uploadDir, $filename) {
    
  }

  /**
   * Crea la directory passata come parametro
   * @param string $dirName percorso della directory
   * @return string il nome della cartella creata
   */
  public function createDir($dirName) {
    mkdir($dirName, 0777);
    return $dirName;
  }

  /**
   * Rinomina con una stringa random il file passato per parametro
   * @param file $file Il file da rinominare
   * @param string $concatenate (opzionale) la stringa che si vuole aggiungere al nome del file
   * @return file il file rinominato 
   */
  public function getNewFilename($dir, $file) {
    global $debug, $config_cuspo;
    if (!is_dir($dir))
      $this->createDir($dir);
    do {
      $newname = rand(0, 10e10);
      $ext = "";
      preg_match($config_cuspo['patterns']['extension'], $file['name'], $ext);
      $newname = $dir . $newname . $ext[0];
    } while (is_file($newname));
    return $newname;
  }

  /**
   * Ritorna, se esiste, il file passato per parametro cercando all'interno 
   * dell'array $_FILE
   * @param string $filename il nome del file
   * @return mixed false se il file non esiste, il file richiesto se questo esiste 
   */
  public function getFile($filename) {
    global $debug;
    if (isset($_FILES[$filename]) && $_FILES[$filename]["size"] != "0")
      return $_FILES[$filename];
    else
      return false;
  }

  /* Rendiamo protetto il metodo per obbligare una redefinizione in una
    sottoclasse necessaria a sbloccare l'utilizzo del metodo dall'esterno.
    Più avanti per ottenere un risultato migliore useremo le Classi Astratte. */

  protected function writeInDB() {
    die(__("Errore nel server", 'cuspo-plugin'));
  }

  /**
   *
   * @global array $current_user
   * @return string l'username della sessione attuale 
   */
  public function getUsername() {
    global $current_user;
    get_currentuserinfo();
    $username = $current_user->user_login;
    return $username;
  }

  /**
   * @global mixed $wpdb
   * @param string $query la query di ricerca da eseguire
   * @return array l'array contenente gli eventuali risultati della ricerca (array associativo)
   */
  public function getRowsAssoc($query) {
    global $wpdb;
    $rows = $wpdb->get_results($query, ARRAY_A);
    return $rows;
  }

  /**
   * Ritorna la query per l'inserimento nel db a partire dall'oggetto passato
   * @param object $object l'oggetto da inserire
   * @return string la query di inserimento
   */
  public function insertQuery($object) {
    $entity = USingleton_cuspo::getInstances("Entity_cuspo");
    $query = "INSERT INTO " . $this->tableName . "(";
    $length = $entity->countObject($object);
    $index = 0;
    foreach ($object as $key => $value) {
      $index++;
      $query .= $key;
      if ($index < $length)
        $query .= ",";
    }
    $query .= ") VALUES (";
    $index = 0;
    foreach ($object as $key => $value) {
      $index++;
      $query .= "'" . $value . "'";
      if ($index < $length)
        $query .= ",";
    }
    $query .= ")";
    return $query;
  }

  /**
   * Crea la query per l'aggiornamento di determinati campi, in una determinata tabella
   * sotto determinate condizioni
   * @param string $table
   * @param array $valueSet i valori da aggiornare array[i]['campo'] array[i]['valore nuovo']
   * @param array $where condizioni che identificano le ennuple da aggiornare
   * @return string la query per l'update
   */
  public function updateQuery($table, $valueSet, $where) {
    $query = "UPDATE " . $table . " ";
    $query .= "SET ";
    $length = count($valueSet);
    foreach ($valueSet as $key => $value) {
      $query .= $value[0] . "=" . "'" . $value[1] . "'";
      if ($key < $length - 1)
        $query .= ",";
      else
        $query .= "";
    }
    $query .= " WHERE ";
    $length = count($where);
    foreach ($where as $key => $value) {
      if (!preg_match("/[INin]/", $value[1]))
        $query .= $value[0] . $value[1] . "'" . $value[2] . "'";
      else
        $query .= $value[0] . $value[1] . $value[2];
      if ($key < $length - 1)
        $query .= " AND ";
    }
    return $query;
  }

  /**
   *
   * @param string $table il nome della tabella dalla quale elminiare
   * @param array[][] $where condizioni
   */
  public function deleteQuery($table, $where) {
    $query = "DELETE FROM $table WHERE ";
    foreach ($where as $key => $value) {
      if (!preg_match("/[INin]/", $value[1]))
        $query .= $value[0] . $value[1] . "'" . $value[2] . "'";
      else
        $query .= $value[0] . $value[1] . $value[2];
      if ($key < $length - 1)
        $query .= " AND ";
    }
    return $query;
  }

  /**
   *
   * @param mixed $file oggetto file o stringa (nome assoluto)
   * @return array le info sul files
   */
  public function getFileInfo($file) {
    if (is_array($file))
      $path_parts = pathinfo($file['name']);
    else
      $path_parts = pathinfo($file);
    return $path_parts;
  }

  /*
   * @param $date string data nel formato Y-m-d H:i:s
   */

  public function getDateArray($date) {
    $split1 = explode(" ", $date);
    $split2 = explode("-", $split1[0]);
    $split3 = explode(":", $split1[1]);
    $split = array_merge($split2, $split3);
    $return = array();
    $return['year'] = $split2[0];
    $return["month"] = $split2[1];
    $return['day'] = $split2[2];
    $return['hour'] = $split3[0];
    $return["minutes"] = $split3[1];
    $return["seconds"] = $split3[2];
    return $return;
  }

  function getInstallationFields() {
    return $this->installationFields;
  }

  /**
   *
   * @return string nome della tabella per le immagini
   */
  function getInstallationTableName() {
    return $this->tableName;
  }

  /*
   * Stesse operazioni di urlifyPath, ma lavora su array associativi (bisogna fornire anche il
   * path da urlifare)
   */

  function urlifyPathsInArray($array, $fieldToUrilfy, $excludeIfFilename = array("default")) {
    foreach ($array as $key => $value) {
      if (!in_array($value[$fieldToUrilfy], $excludeIfFilename))
        $array[$key][$fieldToUrilfy] = $this->urlifyPath($value[$fieldToUrilfy]);
    }
    return $array;
  }

  /*
   * Dato il percorso assoluto del file, restituisce il file sottoforma di URL
   */

  function urlifyPath($path) {
    global $debug,$config_cuspo;
    $docRoot = ABSPATH;
    $path = str_replace($docRoot, "/", $path);
    $path = $config_cuspo['siteurl'] . $path;
    return $path;
  }

  /*
   * Muove le immagini nella relativa cartella
   */

  public function moveUploadedImage($name = "thumbnail") {
    global $config_cuspo;
    $file = $this->getFile($name);
    $destination = $this->getNewFilename($config_cuspo['basedir'] . "images/", $file);
    move_uploaded_file($file['tmp_name'], $destination);
    return $destination;
  }
  
  /**
   *
   * @global type $config_cuspo
   * @param string $file il path del file
   * @param string $append la stringa da appendere
   * @return string il nuovo filename
   */
  public function appendToFileByPath($file,$append) {
    global $config_cuspo;
    $ext = array();
    preg_match($config_cuspo['patterns']['extension'], $file, $ext);
    return str_replace($ext[0], $append.$ext[0], $file);
  }

}

?>
